/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja.de.trabajo5;

/**
 *
 * @author FAMILIA
 */

public class ColaNormal<E> extends AbstracQueue<E> {
    
    
    /**
     * Se declara un arreglo de objetos, que guardará los datos que se quieren ingresar.
     */
    public Object dato[];	
    
    /**
     * Entero, que guardará la referencia de la cabeza de la cola.
     */
    public int cabeza;            
    
    /**
     * Guarda el número de datos que se han ingresado.
     */
    public int contador;		
    private Exception Exception;

    /**
     * Constructor de la clase.
     * @param tamano El valor máximo de datos que se pueden ingresar.
     */
    public ColaNormal(int tamano){
	dato = new Object[tamano];
	cabeza = 0;
	contador = 0;
    }

    /**
     * Agrega datos a la lista
     * @param value Valor de cualquier tipo, que se quiere agregar a la lista.
     * @return Regresa verdadero si se ingresó correctamente el dato.
     * @throws Exception Si no se pudo agregar el dato.
     */
    @Override
    public boolean add(E value)throws Exception{
        if(!llena()){
            int tail = (cabeza + contador) % dato.length;
            dato[tail] = value;
            contador++;
            return true;
	}
        else{
            throw Exception;
	}
    }
	
    /**
     * Elimina el elemento de la lista.
     * @return El elemento en la primera posición de la cola. Elimina de la cola el elemento.
     */
    @Override
	public E remove(){
		E value = (E)dato[cabeza];
		cabeza=(cabeza+1)%dato.length;
		contador--;
		return value;
	}
	
    /**
     * Solo deja mirar el elemento de la cola.
     * @return El primero elemento de la cola.
     */
    @Override
	public E peek(){
		return (E)dato[cabeza];
	}
    
    /**
     * Verifica el tamaño de la cola.
     * @return El número de elementos en la cola.
     */
    @Override
	public int size(){
		return contador;
	}

    /**
     * Verifica si la cola está llena.
     * @return True, si ya no hay espacio en la cola.
     */
    public boolean llena(){
		return contador==dato.length;
	}
    
}

